<?php
/**
 * Description of c_base_controller
 *
 * @author tonatos
 */
abstract class c_base_controller {

    protected $module;

    /**
     * Шабллонизатор
     * @var c_template
     */
    protected $template;
    protected $path;

    /**
     * Функция замены вывода
     *
     * например в шаблоне пишем <h1>[*pagetitle:mvc=`pagetitle`*]</h1>
     * в коде можно вызвать $this->set_modx_field('pagetitle','Новый заголовок страницы');
     * требует модификации phx
     *
     * @global <type> $modx
     * @param <type> $field
     * @param <type> $value
     */
    public function set_modx_field($field,$value){
        global $modx;
        $modx->setPlaceholder("mvc_$field",$value);
    }

    public function add_modx_menu($title, $link=""){
        global $modx;
        if (!isset($modx->mvc_menu)){
            $modx->mvc_menu=array();
        }

        //Если число значит документ modx
        if (is_numeric($link)){
            $link = $modx->makeUrl($link);
        }
        
        $modx->mvc_menu[] = !empty($link)? "<a href='$link'>$title</a>":$title;
        $modx->setPlaceholder("mvc_menu"," » ".implode(" » ",$modx->mvc_menu));
    }

    public function __construct() {
		global $mvc;
        $this->module = substr(get_class($this),2,-11);
        $this->template = new c_template($this->module);
		$this->base_url = $mvc->config['base_url'].$this->module.'/'; // Ссылка на контроллер.		
		$this->data_path = $mvc->config['base_path'].'data/'.$this->module.'/'; // Путь к папке с данными.
		$this->data_url = $mvc->config['base_url'].'data/'.$this->module.'/'; // Ссылка на папку с данными.
		
		if (!file_exists($this->data_path)) mkdir($this->data_path); // Создает путь к папке с данными.
		
		$mvc->lang->load($this->module); // Загружаем нужный словарь для перевода.
    }

    public function inter_redirect($action="index"){
        header("Location: index.php?a=112&id=".(int)$_REQUEST['id']."&action=$this->module/$action");
        die();
    }

    public function redirect($id){
        global $modx;
        $modx->sendRedirect(is_numeric($id)?$modx->makeUrl($id):$id);
        die();
    }

    public function send_mail_from_template($mailto,$subject,$template){
        global $modx;
        $this->template->site_name = $modx->config['site_name'];
        $this->template->site_url = $modx->config['site_url'];
        $body = $this->template->show($template, true);

        return $this->send_mail($mailto, $subject, $body);
    }

    public function send_mail($mailto,$subject,$body){
        global $modx;
        require_once MODX_BASE_PATH.'manager/includes/controls/class.phpmailer-lite.php';

        $emailsender = $modx->config['emailsender'];
        $site_name = $modx->config['site_name'];
        $site_start = $modx->config['site_start'];

        // составление письма
        $smail = new PHPMailerLite();
        $smail->IsMail();
        $smail->IsHTML(true);
        $smail->From = $emailsender;
        $smail->FromName = $site_name;
        $smail->Subject = $subject;
        $smail->Body = $body;
        $smail->AddAddress($mailto);
        return $smail->Send();
    }

    protected function generate_password($length = 8)
    {
        $allowable_characters = "abcdefghjkmnpqrstuvxyzABCDEFGHJKLMNPQRSTUVWXYZ1234567890";
        $ps_len = strlen($allowable_characters);
        mt_srand((double)microtime()*1000000);
        $pass = "";
        for($i = 0; $i < $length; $i++) {
            $pass .= $allowable_characters[mt_rand(0,$ps_len-1)];
        }
        return $pass;
    }

    //Замена механизма шаблонизатора    
    protected function show($name, $return=false) {
        global $modx; //чтобы можно было использовать внутри шаблона
        global $mvc; //чтобы можно было использовать внутри шаблона
        $path = $mvc->parse("{base_path}views/$this->module/$name.php");

        if (file_exists($path) == false)
        {
                throw new Exception('Template not found in '. $path);
                return false;
        }

        if ($return) ob_start();

        include ($path);

        if ($return){
            $content = ob_get_contents();
            ob_end_clean();
            return $content;
        }
    }

    //Замена механизма шаблонизатора    
    protected function show2($name, $return=false) {
        global $modx; //чтобы можно было использовать внутри шаблона
        $path = MVC_BASE_PATH."views/$this->module/$name.php";
        if (file_exists($path) == false)
        {
                throw new Exception('Template not found in '. $path);
                return false;
        }

        if ($return) ob_start();

        include ($path);

        if ($return){
            $content = ob_get_contents();
            ob_end_clean();
            return $content;
        }
    }

    /**
     * Вызов защищенного метода контроллера, сделано для возможности закрытия
     * методов которые нельзя вызывать напрямую с сайта, как например так:
     * http://www.trfa.ru/assets/snippets/mvc/forum/cron а через данную функцию
     * можно выполнять protected функции между контроллерами, например:
     * $forum = new c_forum_controller();
     * $cron  = $forum->call_protected("cron");
     *
     * @global <type> $mvc
     * @param string $function_name
     * @param mixed $params
     * @return string
     */
    public function call_protected($function_name,$params=null){
        global $mvc;
        if (!is_string($function_name)) {
            $mvc->send_error_page();
        }
        return $this->$function_name($params);
    }
}
?>
